from django import forms
from django.core.exceptions import ValidationError

from web.forms.bootstrap import BootStrapForm
from web.forms.widgets import ColorRadioSelect
from web import models


class ProjectModelForm(BootStrapForm, forms.ModelForm):
    """
        自定义ProjectModelForm 组件生成form表单，包含项目标题，项目底色，项目描述三个输入框
    """

    bootstrap_class_exclude = ['color']

    class Meta:
        model = models.Project
        fields = ['name', 'color', 'desc']
        widgets = {
            'desc': forms.Textarea,
            'color': ColorRadioSelect(attrs={'class':'color-radio'})
        }
        error_messages = {
            'name': {
                'required': '项目名不能为空！'
            },
            'color': {
                'required': '项目背景不能为空！'
            },
            'desc': {
                'required': '项目描述不能为空！'
            },
        }

    def __init__(self, request, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.request = request

    def clean_name(self):
        """
            项目名校验
        """
        name = self.cleaned_data['name']
        # 1. 当前用户是否已创建过此项目(项目名是否已存在)？
        # 注意：要限制是当前登录用户之前未曾创建过同名的项目，其他用户无权干涉！
        exists = models.Project.objects.filter(name=name, creator=self.request.tracer.user).exists()
        if exists:
            raise ValidationError('项目名已存在')

        # 2. 当前用户是否还有额度进行创建项目？
        # 最多创建N个项目
        # self.request.tracer.price_policy.project_num

        # 现在已创建的项目数量
        count = models.Project.objects.filter(creator=self.request.tracer.user).count()

        if count >= self.request.tracer.price_policy.project_num:
            raise ValidationError('您创建的项目个数已超限，如需继续使用，请重新选择会员制度充值！')
        return name
